#!/usr/bin/perl
# $0 = nombre de archivo
# $$ PID
# %Env has de variable
# 

use lib split(':',$ENV{'PATH'});
use strict;
use warnings;
use subroutines;
use POSIX qw/ strftime /;



#print "\nComando ejecutado: ".$0." ".join(" ",@ARGV)."\n\n"; 

my %argumentosParseados;

#print "USUARIO: $ENV{USER}\n\n";
#print "FECHA Y HORA: ", strftime( "%d/%m/%Y %H:%M:%S", localtime(time) ),"\n";

%argumentosParseados = &subroutines::parseArguments(@ARGV);

if (exists($argumentosParseados{'-h'})){

  &subroutines::showAyuda();
  
  exit;
}

my @estados = ( 'Aceptada', 'Rechazado', 'Pendiente');
    
my $beneficioPos = 2;

my $agenciaPos = 0;

my $provinciaPos = 10;

my $estadoPos = 14;

my $DIRARRIB = $ENV{'grupo'}.'/nuevos' || die "No está seteado el directorio de arribo de archivos";

my $DIRLIST = $ENV{'grupo'}.'/list' || die "No está seteado el directorio list";

# Extraigo las opciones para cada parametro

my $files = &subroutines::getFiles(@{$argumentosParseados{'-f'}});

my %beneficios = map {$_ => 1} @{$argumentosParseados{'-b'}};

if (exists($beneficios{'*'})){
    
    undef %beneficios;
}

my %agencias = map {$_ => 1} @{$argumentosParseados{'-a'}};

if (exists($agencias{'*'})){
    
    undef %agencias;
}

my $matrizControl = exists($argumentosParseados{'-c'});

#Genero un mapa de bits para la combinación de argumentos por estado: 
# El mapa esta compuesto de 3 bits, el primero representa los aceptados, el segundo los rechazados y el tercero los pendientes.

if ( !$matrizControl && ( exists($argumentosParseados{'-ea'}) || exists($argumentosParseados{'-ep'}) || exists($argumentosParseados{'-er'}))){

 print "La opciones -ea, -ep y/o -er deben ir con -c\n\n";
 exit 
} 


my $aceptados = exists($argumentosParseados{'-ea'}) && $matrizControl;

$aceptados <<=2;

my $rechazados = exists ($argumentosParseados{'-er'}) && $matrizControl;

$rechazados <<=1;

my $pendientes = exists($argumentosParseados{'-ep'}) && $matrizControl;

my $flag = $aceptados | $rechazados | $pendientes;

my $outputAmbos = exists($argumentosParseados{'-td'}) || exists($argumentosParseados{'-dt'});

my $outputTest = exists($argumentosParseados{'-t'});

my $outputArchivo = exists($argumentosParseados{'-d'});

# Si la opcion de salida es archivo, abro uno.

if ($outputAmbos || $outputArchivo){
    
    my $secuencia = &subroutines::getSecuencia();
   
   
    open(SALIDA,'>'.$DIRLIST.'/plist.'.($secuencia));
    
}

print subroutines::TEMPORAL "\nComando ejecutado: ".$0." ".join(" ",@ARGV)."\n\n"; 

print subroutines::TEMPORAL "USUARIO: $ENV{USER}\n\n";

print subroutines::TEMPORAL "FECHA Y HORA: ", strftime( "%d/%m/%Y %H:%M:%S", localtime(time) ),"\n";

my @lista;

my %control;

my %provinciaSuma;

my %beneficioSuma;

&subroutines::printHeader;

my $beneficiariosTotal = 0;

# Proceso los archivos y genero la lista y la matriz de control si se pide

while (my $file = <$DIRARRIB/{$files}>){
    
    next if !open (FILE, $file);
            
        while (my $l = <FILE>){
      
        chomp($l);
        
        next if !$l;
        
        my @array = split(',', $l);
        
        my $size = keys %beneficios;
        
        next if ( $size and (!exists($beneficios{$array[$beneficioPos]})));
      
        $size = keys %agencias;
                
        next if ( ($size = keys %agencias) and (!exists($agencias{$array[$agenciaPos]})));
        
        if ($matrizControl){
        
        my $thisFlags = 0;
 
        foreach my $i (0..$#estados){
            
           my $thisFlag = $array[$estadoPos] eq $estados[$i];
           
           $thisFlag <<= ($#estados - $i);
           
           $thisFlags += $thisFlag;
            
        }
      
        next if ($flag && !($thisFlags & $flag));
        
        $control{$array[$provinciaPos]}{$array[$beneficioPos]}++;
        
        $provinciaSuma{$array[$provinciaPos]} ++;
        
        $beneficioSuma{$array[$beneficioPos]} ++;
}
          
        push (@lista, @array);
        
        &subroutines::printRows(@array);
        
        $beneficiariosTotal++;
                       
    }
    
    
    
    close(FILE);

}

print subroutines::TEMPORAL "Total de beneficiarios: $beneficiariosTotal";

print subroutines::TEMPORAL "\n";

$matrizControl?subroutines::printControl(\%control, \%provinciaSuma, \%beneficioSuma):0;

# Si la opcion es salidad estandar, copio del archivo temporal a la salida estandar

if ($outputAmbos || ($outputTest) || !$outputArchivo ){
    
   print `cat /tmp/plist.tmp`;
   
}

#IDEM comentario anterior pero para salida por archivo.

if ($outputAmbos || $outputArchivo){
    
   print SALIDA `cat /tmp/plist.tmp`;
   
   close(SALIDA);
}
close(subroutines::TEMPORAL);
